interface A {
  fn: (value: string) => string
}

// 继承, 函数参数中参数类型不同，会冲突
// interface B extends A {
//   fn: (value: number) => string
// }

interface B {
  fn: (value: number) => string
}

// 交叉类型, 函数参数中参数类型不同，不会冲突,函数重载
type C = A & B

let c: C = {
  fn(value: string | number) {
    if (typeof value === 'string') {
      return value
    }
    return value.toString()
  }
}

// (property) fn: ((value: string) => string) & ((value: number) => string)
console.log(c.fn('123'))